//
//  YWDownloadManager2.m
//  videoTest3
//
//  Created by jun peng on 2022/7/28.
//

#import "YWDownloadManager2.h"

#import "YWDownloadStatus.h"
#import "YWDownloadDataTaskStatus2.h"

#define downloadingArrayMaxNum 3

@interface YWDownloadManager2 ()

//通过YWDownloadStatus的用网上videoURL作为key、找到对应的dataTask
@property(nonatomic,strong)NSMutableDictionary *dataTaskDict;

@property(nonatomic,strong)NSMutableArray *downloadingArray; //正在下载数组
@property(nonatomic,strong)NSMutableArray *waitingArray; //等待中数组

//当前下载的任务模型
@property(nonatomic,strong)YWDownloadDataTaskStatus2 *downloadingDataTaskStatus;

//用来轮流的定时器
@property (nonatomic,strong)NSTimer *timer;


@end

@implementation YWDownloadManager2

//单例
SingleM(downloadManager)


//添加定时器
-(void)addTimer{
    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(takeTurnsToDownload) userInfo:nil repeats:YES];
    
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    self.timer = timer;
}

//移除定时器
-(void)removeTimer{
    
    [self.timer invalidate];
    
    self.timer = nil;
    
}



//轮流下载 （围绕downloadingArray定时器轮流去下载）
-(void)takeTurnsToDownload{
    
    if (self.downloadingDataTaskStatus != nil) { //1、假如self.downloadingDataTaskStatus不为空
        
        [self.downloadingDataTaskStatus pauseDataTask]; //2、先暂停正在下载的
        
        
            //发送通知(发送通知告诉VC上一个任务完成的进度)
            NSDictionary *userInfo = @{YWDownloadStatusKey:self.downloadingDataTaskStatus.status};
            [[NSNotificationCenter defaultCenter] postNotificationName:YWProgressDownloadNote object:self userInfo:userInfo];

        
        if ([self.downloadingArray containsObject:self.downloadingDataTaskStatus]) { //3、假如正在下载的在数组里面
            NSInteger i = [self.downloadingArray indexOfObject:self.downloadingDataTaskStatus];
            
            if (i < self.downloadingArray.count - 1) { //4、播放下一个
                
                i++; //去下一个
                
                    YWDownloadDataTaskStatus2 *dataTaskStatus = self.downloadingArray[i];
//                    [dataTaskStatus createDataTask];
                //这里播放不用改枚举（手动操作方法里面改）、不用保存数据库（手动操作方法里面保存和progress回调方法里面保存）、不需要发送通知（手动操作方法里面发送和上面的self.downloadingDataTaskStatus也有发送）
                [dataTaskStatus resumeDataTask];
                
                    self.downloadingDataTaskStatus = dataTaskStatus;
            }
            else{ //5、播放第一个
                
                i = 0; //回到第一个
                
                
                    YWDownloadDataTaskStatus2 *dataTaskStatus = self.downloadingArray[i];
//                    [dataTaskStatus createDataTask];
                //这里播放不用改枚举（手动操作方法里面改）、不用保存数据库（手动操作方法里面保存和progress回调方法里面保存）、不需要发送通知（手动操作方法里面发送和上面的self.downloadingDataTaskStatus也有发送）
                [dataTaskStatus resumeDataTask];
                    self.downloadingDataTaskStatus = dataTaskStatus;
            }
        }
        else{ //6、假如正在下载的不在数组里面 （可能是它完成下载或者暂停下载或者变成了等待中从而被移除了正在下载数组）
            
            if (self.downloadingArray.count > 0) { //7、那就播放第一个
                YWDownloadDataTaskStatus2 *dataTaskStatus = self.downloadingArray[0];
//                [dataTaskStatus createDataTask];
                //这里播放不用改枚举（手动操作方法里面改）、不用保存数据库（手动操作方法里面保存和progress回调方法里面保存）、不需要发送通知（手动操作方法里面发送和上面的self.downloadingDataTaskStatus也有发送）
                [dataTaskStatus resumeDataTask];
                self.downloadingDataTaskStatus = dataTaskStatus;
            }
            
        }
        
    }
    else{ //8、假如self.downloadingDataTaskStatus为空、即刚进来还没发起下载
        
        if (self.downloadingArray.count > 0) { //9、那就播放第一个
            YWDownloadDataTaskStatus2 *dataTaskStatus = self.downloadingArray[0];
//            [dataTaskStatus createDataTask];
            //这里播放不用改枚举（手动操作方法里面改）、不用保存数据库（手动操作方法里面保存和progress回调方法里面保存）、不需要发送通知（手动操作方法里面发送和上面的self.downloadingDataTaskStatus也有发送）
            [dataTaskStatus resumeDataTask];
            self.downloadingDataTaskStatus = dataTaskStatus;
        }
        
    }
    
}


//开启任务（传数组）（数据库已经出现过的任务、正在下载但因为退出app（任务不存在字典了）或者退出VC界面（任务还存在字典）再进来的任务）
-(void)beginDataTaskWithStatusArray:(NSArray <YWDownloadStatus *>*)statusArray{
    
    for (YWDownloadStatus *status in statusArray) {
        
        YWDownloadDataTaskStatus2 *dataTaskStatus2 = self.dataTaskDict[status.VideoUrl];
        if (dataTaskStatus2 != nil) {
            
            //已经存在字典任务中、退出了列表VC界面重新进来
            
    //        2、正在下载重新进来 （存在字典任务中、存在数据库中、枚举downloading）、不需要resume
    //        3、等待下载重新进来（存在字典任务中、存在数据库中、枚举waiting）、不需要resume
    //        4、暂停重新进来（存在字典任务中、存在数据库中、枚举pause）、不需要resume
            
        //按理来说这里本来就存在1.字典中、就不需要再加入字典、、且这里不能对2.数组操作、数组操作应该是这里以外的地方操作、、不能设置3.枚举、枚举设置操作应该是这里以外的地方操作、、4.视频路径文件夹和5.数据库更加不用说了不能在这里设置
        //信息模型已经存在任务字典中、“是退出了列表VC界面重新进来的”、所以这里就是维持原状（原来枚举是什么就是什么、原来是正在下载就是正在下载、原来是等待中就是等待中、原来是暂停就是暂停）、也不需要发送通知叫VC重新刷新列表、VC在一开始进来和有自己的定时器会自己刷新
            
        }
        else{
            
    //不存在字典任务中、“退出了app重新进来”
            
            
    //        5、正在下载关了app再进来（不存在字典任务中、存在数据库中、枚举downloading）、需要resume
    //        6、等待下载关了app再进来（不存在字典任务中、存在数据库中、枚举waiting）、不需要resume
    //        7、暂停关了app再进来（不存在字典任务中、存在数据库中、枚举pause）、不需要resume
            
            
    //一、按理来说、1、视频路径文件夹（任务里面决定了下载情况和路径且不会再改变） 和 2、模型信息数据库只负责储存（VC做了判断决定了是退出VC情况还是退出app的情况）、<第1和第2点不需要在这里判断>、、、3、这里字典肯定要加入、4、枚举维持原判、5、根据枚举分派数组、6、若要修改数组安排才要修改枚举、7、遍历正在下载数组（小于等于3个元素）发起下载、8、若有需要就定时器轮流下载
            
            
    //二、5个类（YWDownloadController2、YWDownloadDataBaseTool、YWDownloadManager2、YWDownloadDataTaskStatus2、YWDownloadStatus）兼顾上述 5 样（视频路径文件夹、模型信息数据库、字典、枚举、数组）（包括获取、与判断、、赋值、与存储）
            
            
            //1、不管三七二十一先加入字典、创建YWDownloadDataTaskStatus、并保存到字典 - -
            YWDownloadDataTaskStatus2 *dataTaskStatus = [[YWDownloadDataTaskStatus2 alloc] init];
            dataTaskStatus.status = status;
            [self.dataTaskDict setObject:dataTaskStatus forKey:status.VideoUrl];
            
            //1-1、注意：YWDownloadDataTaskStatus2的传入模型和开始下载的方法要分开类似YWDownloadDataTaskStatus才行、类似上面的 - -
            
            //2、枚举先维持原判、下面再根据情况需要修改的修改 - -
            
            //3、根据枚举决定去哪两个数组
            
            switch (status.downloadType) {
                case YWDownloadType_Waiting:
                {
                    [self.waitingArray addObject:dataTaskStatus];
                    
                }
                    break;
                case YWDownloadType_Downloading:
                {
                    
            //4、假如正在下载数组因为不知什么原因已满3个却还有正在下载枚举的要将它改枚举并加入等待中数组、、、并且要修改其枚举为‘等待中’
                    if (self.downloadingArray.count < downloadingArrayMaxNum) {
                        
                        //加入正在下载中数组
                        [self.downloadingArray addObject:dataTaskStatus];
                    }
                    else{
                        
                        //假如下载中数组已经满了3个了、就要将模型改为等待中
                        dataTaskStatus.status.downloadType = YWDownloadType_Waiting;
                        //更新数据库
                        [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus.status];
                        //并且加入等待中数组
                        [self.waitingArray addObject:dataTaskStatus];
                    }
                    
                }
                    break;
                    
                default:
                    break;
            }
            
            
        }
        
        
    }
    
    
    //5、遍历完成后、假如正在下载数组不满3个就从正在等待数组（若等待数组有数据的话）抽取填满、、、并且要修改其枚举为‘正在下载’、（记住这个是写在“遍历完成后”）
    if (self.downloadingArray.count < downloadingArrayMaxNum) {
        
        NSInteger restCount = downloadingArrayMaxNum - self.downloadingArray.count;
        
        //能补全restCount个个数的机会去正在下载数组
        for (NSInteger i = 0; i < restCount; i++) {
            
            //前提条件是等待中数组要有数据
            if (self.waitingArray.count>0) {
                
                //就拿第一个数据去移动到正在下载中数组
                YWDownloadDataTaskStatus2 *dataTaskStatus = self.waitingArray[0];
                dataTaskStatus.status.downloadType = YWDownloadType_Downloading;
                //更新数据库
                [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus.status];
                [self.downloadingArray addObject:dataTaskStatus];
                [self.waitingArray removeObjectAtIndex:0];
                 
            }
            else{
                
                //假如等待中数组已经没有数据了就跳出这个循环了
                break;
                
            }
        }
    }
    
    //5-1、根据第4点、第5点的意思是、你要修改数组的同时才需要修改枚举、否则维持原来‘退出app时再进来前’的枚举情况
    
    //6、正在下载数组开始下载 （记住这个是写在“遍历完成后”）、遍历多一次逐个去下载、(不需要再判断枚举了、一般在正在下载数组的枚举都是‘正在下载中’)
#warning - 用轮流下载就不用这个主动去下载方法了
//    for (YWDownloadDataTaskStatus2 *dataTaskStatus in self.downloadingArray) {
//        [dataTaskStatus createDataTask];
//    }
    
    //因为上面有可能有更新了数据库情况、所以这里可以发一个通知、这里是多个模型、所以我这里就不发送userInfo了
//    NSDictionary *userInfo = @{YWDownloadStatusKey:self.self.downloadingDataTaskStatus.status};
    [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:nil];
    
    
//    YWLog(@"waitArrayCount:%ld",self.waitingArray.count);
    
    
    //开启轮流下载定时器 （几乎伴随着整个单例生命）
    if (self.timer == nil) {
        [self addTimer];
    }
    
    
    //7、其余枚举就不加入数组在字典里候命就行
    
    //8、若有需要就做正在下载数组用｜定时轮流下载
    

    
}


//创建了一个任务（全新的、数据库没有出现过的任务）
-(void)createOneDataTaskWithStatus:(YWDownloadStatus *)status{
    
    //1、头一次 全新的 （不存在字典任务中、不存在数据库中、枚举waiting等待分配是否转变为枚举downloading）、可能需要也可能不需要resume
    
    //1-1、既然全新的、没有出现在数据库里的那怎么会出现在任务字典呢、所以不用判断、肯定不在任务字典里

    //1-2、创建YWDownloadDataTaskStatus、并保存到字典
    YWDownloadDataTaskStatus2 *dataTaskStatus = [[YWDownloadDataTaskStatus2 alloc] init];
    dataTaskStatus.status = status;
    [self.dataTaskDict setObject:dataTaskStatus forKey:status.VideoUrl];
    
   
    if (self.downloadingArray.count < downloadingArrayMaxNum) {
        dataTaskStatus.status.downloadType = YWDownloadType_Downloading;
        [self.downloadingArray addObject:dataTaskStatus];
        
        //开启下载
#warning - 用轮流下载就不用这个主动去下载方法了
//        [dataTaskStatus createDataTask];
    }
    else{
    
        dataTaskStatus.status.downloadType = YWDownloadType_Waiting;
        [self.waitingArray addObject:dataTaskStatus];
        
        //创建了一个等待任务
#warning - 用轮流下载就不用这个主动去下载方法了
//        [dataTaskStatus createWaitingDataTask];
        
    }
    
    //把新的模型添加到数据库
    [YWDownloadDataBaseTool addDownloadingStatus: dataTaskStatus.status];
    
    
    //发送通知、全新的一个模型、感觉可以发送一个通知刷新应该不花太多时间
    NSDictionary *userInfo = @{YWDownloadStatusKey:dataTaskStatus.status};
    [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:userInfo];
    
}


//继续一个任务
-(void)continueOneDataTaskWithStatus:(YWDownloadStatus *)status{
    
//按了暂停中：若正在播放数组还不满3个、就加入正在播放数组、否则加入正在等待数组
    
    YWDownloadDataTaskStatus2 *dataTaskStatus = self.dataTaskDict[status.VideoUrl];
    
    if (self.downloadingArray.count < downloadingArrayMaxNum) {
        
        //正在播放数组还不满3个、就加入正在播放数组
        dataTaskStatus.status.downloadType = YWDownloadType_Downloading;
        [self.downloadingArray addObject:dataTaskStatus];
        
        //继续播放
#warning - 用轮流下载就不用这个主动去下载方法了
//z        [dataTaskStatus continueDataTask];
    }
    else{
        
        //否则加入正在等待数组
        dataTaskStatus.status.downloadType = YWDownloadType_Waiting;
        [self.waitingArray addObject:dataTaskStatus];
    }
    
    
        //处理数据库
        [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus.status];
    
        //发送通知
        NSDictionary *userInfo = @{YWDownloadStatusKey:dataTaskStatus.status};
        [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:userInfo];
    
}

//从等待中优先播放一个任务
-(void)advanceOneDataTaskWithStatus:(YWDownloadStatus *)status{
    
//按了等待中：（若正在播放数组还不满3个、就A加入正在播放数组、一般正在数组满了才会有等待中的数据、所以这条可能不需要判断）、否则从正在播放数组先移除第0个B、并将B加入正在等待数组、然后再将A加入正在播放数组
    
    YWDownloadDataTaskStatus2 *dataTaskStatus = self.dataTaskDict[status.VideoUrl];
    
    //修改枚举
    dataTaskStatus.status.downloadType = YWDownloadType_Downloading;
    
    //把这一个任务直接加入正在播放数组（不需要判断正在播放数组是不是满3个了、直接加入就行）
    [self.downloadingArray addObject:dataTaskStatus];
    
#warning - 这里之前应该漏了移除等待中数组的
    //移除等待中数组的
    [self.waitingArray removeObject:dataTaskStatus];
    
    //处理数据库
    [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus.status];

    
    //开启播放
#warning - 用轮流下载就不用这个主动去下载方法了
//    [dataTaskStatus createDataTask];
    
    //加入了正在播放数组之后、再判断正在播放数组是不是大于3个了
    if (self.downloadingArray.count > downloadingArrayMaxNum) {
        
        //假如正在播放数组是不是大于等于3个了、就移除第0个B、并让它枚举变成等待中、并将B加入等待中数组、暂停B播放
        
        YWDownloadDataTaskStatus2 *dataTaskStatus2 = self.downloadingArray[0];
        dataTaskStatus2.status.downloadType = YWDownloadType_Waiting;
        [self.downloadingArray removeObjectAtIndex:0];
        [self.waitingArray addObject:dataTaskStatus2];
        
        //处理数据库
        [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus2.status];
        
#warning - 用轮流下载就不用这个主动去下载方法了
        //暂停播放
//        [dataTaskStatus2 pauseDataTask];
    }
    
    //因为上面有可能有更新了数据库情况、所以这里可以发一个通知、这里可能涉及多个模型、所以我这里就不发送userInfo了
//    NSDictionary *userInfo = @{YWDownloadStatusKey:self.self.downloadingDataTaskStatus.status};
    [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:nil];
    
}

//暂停一个任务
-(void)pauseOneDataTaskWithStatus:(YWDownloadStatus *)status{
    
//按了下载中：变成暂停、从下载中数组移除、看正在下载中数组满不满3个、不满就看等待中数组存不存在数据有就抽取一个加入正在下载的数组
    
    YWDownloadDataTaskStatus2 *dataTaskStatus = self.dataTaskDict[status.VideoUrl];
    
    //枚举变成暂停中、移除正在下载数组、不需要加入等待中数组
    dataTaskStatus.status.downloadType = YWDownloadType_Pause;
    [self.downloadingArray removeObject:dataTaskStatus];
    
    //处理数据库
    [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus.status];
    
#warning - 用轮流下载就不用这个主动去下载方法了
//    [dataTaskStatus pauseDataTask];
    
    //暂停之后，发现目前加载中数组不满3个就从正在等待数组抽取1个来填、、、并且要修改其枚举为‘正在下载’
    if (self.downloadingArray.count < downloadingArrayMaxNum) {
        //前提条件是等待中数组要有数据
        if (self.waitingArray.count>0) {
            
            //就拿第一个数据去移动到正在下载中数组
            YWDownloadDataTaskStatus2 *dataTaskStatus2 = self.waitingArray[0];
            dataTaskStatus2.status.downloadType = YWDownloadType_Downloading;
            [self.downloadingArray addObject:dataTaskStatus2];
            [self.waitingArray removeObjectAtIndex:0];
            
            //处理数据库
            [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus2.status];
            
            //开启播放
#warning - 用轮流下载就不用这个主动去下载方法了
//            [dataTaskStatus2 createDataTask];
             
        }
    }
    
    //因为上面有可能有更新了数据库情况、所以这里可以发一个通知、这里可能涉及多个模型、所以我这里就不发送userInfo了
//    NSDictionary *userInfo = @{YWDownloadStatusKey:self.self.downloadingDataTaskStatus.status};
    [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:nil];
    
}

//删除了一个任务 -（记住Manager只负责处理中的任务、所以这方法是不包括下载完成的视频）
-(void)removeOneDataTaskWithStatus:(YWDownloadStatus *)status{
    
    //从字典移除、从下载中数组移除、从等待中数组移除
    YWDownloadDataTaskStatus2 *dataTaskStatus = self.dataTaskDict[status.VideoUrl];
    
    if (dataTaskStatus == nil) {
        return;
    }
    
    
    //删除任务、永久不再下载
    [dataTaskStatus removeDataTask];
    
    //从字典移除任务
    [self.dataTaskDict removeObjectForKey:dataTaskStatus.status.VideoUrl];
    
    //从数组移除任务
    [self removeStatus:dataTaskStatus fromArray:self.downloadingArray];
    [self removeStatus:dataTaskStatus fromArray:self.waitingArray];
    
    
    //处理数据库
    [YWDownloadDataBaseTool removeDownloadingStatus:dataTaskStatus.status];

    //1、这里移除的是正在下载中的、但不可能移除完成了的、“VC调用这个方法只能移除正在处理任务的模型”☑️
    
    //2、下载中的数据库在YWDataTaskStatus里面移除
    
    //3、视频文件路径也在YWDataTaskStatus里面移除☑️
    
    //4、假如是移除完成了的数据库在VC移除？”因为移除完成了的视频不应该调用Manager这个remove方法“
    
    //5、移除完成的视频文件路径也是在VC移除
    
    //完成了一个、就自动下载下一个
    if (self.downloadingArray.count < downloadingArrayMaxNum) {
        //前提条件是等待中数组要有数据
        if (self.waitingArray.count>0) {
            
            //就拿第一个数据去移动到正在下载中数组
            YWDownloadDataTaskStatus2 *dataTaskStatus2 = self.waitingArray[0];
            dataTaskStatus2.status.downloadType = YWDownloadType_Downloading;
            [self.downloadingArray addObject:dataTaskStatus2];
            [self.waitingArray removeObjectAtIndex:0];
            
            
            //处理数据库
            [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus2.status];
            
            //开启播放
#warning - 用轮流下载就不用这个主动去下载方法了
//            [dataTaskStatus2 createDataTask];
             
        }
    }
    
    
    
    //因为上面有可能有更新了数据库情况、所以这里可以发一个通知、这里可能涉及多个模型、所以我这里就不发送userInfo了
//    NSDictionary *userInfo = @{YWDownloadStatusKey:self.self.downloadingDataTaskStatus.status};
    [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:nil];
}


-(void)finishDownloadNote:(NSNotification *)notification{
    
    //从字典移除、从下载中数组移除、从等待中数组移除、、、若等待中数组有数据、抽第一个加入正在下载中数组
    
    //完成任务就要从字典移除模型
    
    //拿出模型
    YWDownloadStatus *status = notification.userInfo[@"YWDownloadStatusKey"];

    YWDownloadDataTaskStatus2 *dataTaskStatus = [self.dataTaskDict objectForKey:status.VideoUrl];
    if (dataTaskStatus == nil) {
        return;
    }
    
    [self.dataTaskDict removeObjectForKey:dataTaskStatus.status.VideoUrl];
    
    //从数组移除任务
    [self removeStatus:dataTaskStatus fromArray:self.downloadingArray];
    [self removeStatus:dataTaskStatus fromArray:self.waitingArray];
    
    //这里就不需要枚举、数据库、通知了、因为YWDownloadDataTaskStatus里面的完成回调里面已经做了
    
    //完成了一个、就自动下载下一个
    if (self.downloadingArray.count < downloadingArrayMaxNum) {
        //前提条件是等待中数组要有数据
        if (self.waitingArray.count>0) {
            
            //就拿第一个数据去移动到正在下载中数组
            YWDownloadDataTaskStatus2 *dataTaskStatus2 = self.waitingArray[0];
            dataTaskStatus2.status.downloadType = YWDownloadType_Downloading;
            [self.downloadingArray addObject:dataTaskStatus2];
            [self.waitingArray removeObjectAtIndex:0];
            
            
            
            //处理数据库
            [YWDownloadDataBaseTool updateDownloadingStatus:dataTaskStatus2.status];
            
            //这个通知可以放在判断里面、因为外面的完成已经有一个通知了
            //因为上面有可能有更新了数据库情况、所以这里可以发一个通知、这里可能涉及多个模型、所以我这里就不发送userInfo了
        //    NSDictionary *userInfo = @{YWDownloadStatusKey:self.self.downloadingDataTaskStatus.status};
            [[NSNotificationCenter defaultCenter] postNotificationName:YWDownloadRefreshListNote object:self userInfo:nil];
            
            //开启播放
#warning - 用轮流下载就不用这个主动去下载方法了
//            [dataTaskStatus2 createDataTask];
             
        }
    }
    
}

//从数组移除模型方法
-(void)removeStatus:(YWDownloadDataTaskStatus2 *)status fromArray:(NSMutableArray <YWDownloadDataTaskStatus2 *>*)mArray{
    
    [mArray enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        YWDownloadDataTaskStatus2 *downloadStatus = (YWDownloadDataTaskStatus2 *)obj;

        if ([downloadStatus.status.VideoUrl isEqualToString:status.status.VideoUrl]){

             [mArray removeObject:downloadStatus];
            *stop = YES;

        }
    }];
    
}




//---//---//---//---//---//---//---//---//---//---//---//---//---//---//---//---//---//---//---//---//------//---//---//---//---//




- (instancetype)init
{
    self = [super init];
    if (self) {
       
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finishDownloadNote:) name:YWFinishDownloadNote object:nil];
    }
    return self;
}

-(NSMutableDictionary *)dataTaskDict{
    if (_dataTaskDict == nil) {
        _dataTaskDict = [NSMutableDictionary dictionary];
    }
    return _dataTaskDict;
}

-(NSMutableArray *)downloadingArray{
    if (_downloadingArray == nil) {
        _downloadingArray = [NSMutableArray array];
    }
    return _downloadingArray;
}

-(NSMutableArray *)waitingArray{
    if (_waitingArray == nil) {
        _waitingArray = [NSMutableArray array];
    }
    return _waitingArray;
}

//判断这个模型存不存在数据库
+(void)judgeStatusExistInDataBase:(NSString *)videoUrl ifNoExist:(void(^)(void))ifNoExist{
    
    YWDownloadStatus *downloadStatus = [YWDownloadDataBaseTool getFinishStatusWithVideoUrl:videoUrl];
    
    if (downloadStatus == nil) {
        
        downloadStatus = [YWDownloadDataBaseTool getDownloadingStatusWithVideoUrl:videoUrl];
        
        //假如正在下载数据库也不存在，那么可以把存入来的模型加进数据库了
        if (downloadStatus == nil) {
            
            if (ifNoExist) {
                ifNoExist();
            }
            
        }
      
    }
    
}

-(void)dealloc{
    
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    
    //这个定时器几乎是伴随着这单例的生命
    [self removeTimer];
}


@end
